#pragma once

#include <iostream>
#include <string>
#include <cstdio>
#include <set>

const int line_size = 1024;

class Command
{     
public:
    Command()
    {
        _while_list.insert("ls");
        _while_list.insert("pwd");
        _while_list.insert("ls -l");
        _while_list.insert("ll");
        _while_list.insert("touch");
        _while_list.insert("whoami");
    }

    bool SafeCheck(std::string &comstr)
    {
        auto iter = _while_list.find(comstr);
        return iter == _while_list.end() ? false : true;
    }

    // 给你一个命令字符串“ls -l”，让你执行，执行完后，把结果返回
    std::string Execute(std::string comstr)
    {
        // 1.pipe
        // 2. fork + fup2(pipe[1], 1) + exec*, 执行结果给父进程，父进程读取pipe[0]
        // 3.return
        // FILE *popen(const char *command, const char *type);
        // int pclose(FILE *stream);

        if(!SafeCheck(comstr))
        {
            return std::string(comstr + "不支持");
        }

        FILE *fp = popen(comstr.c_str(), "r");
        if(nullptr == fp)
        {
            return std::string("Failed");
        }

        char buffer[line_size];
        std::string result;
        while(true)
        {
            char *ret = :: fgets(buffer, sizeof(buffer), fp);
            if(!ret) break;
            result += ret;
        }

        pclose(fp);
        return result.empty() ? std::string("Done") : result;
    }
private:
    std::set<std::string> _while_list;
};